package com.yangtao.prototype.common.tree;

import com.yangtao.framework.util.JsonUtil;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 树的解析类
 *
 * @author 杨涛
 * @date: 11-4-4 下午8:29
 */
public class TreeResolver {

	/**
	 * 将一个树状结构数组变为一个json字符串
	 *
	 * @param trees 树状结构数组
	 * @param <X>
	 * @return
	 */
	public static <X extends TreeNode> String toStoreString(List<X> trees) {
		return toStoreString(trees, null);
	}

	/**
	 * 将一个树状结构数组变为一个json字符串
	 *
	 * @param trees  树状结构数组
	 * @param rootId 根节点ID
	 * @param <X>
	 * @return
	 */
	public static <X extends TreeNode> String toStoreString(List<X> trees, String rootId) {
		List<X> resolvedTree = resolveTree(trees, rootId);
		return JsonUtil.obj2Json(resolvedTree, true);
	}

	/**
	 * 将平面结构的数据，变成立体结构的数据
	 *
	 * @param trees
	 */
	public static <X extends TreeNode> List<X> resolveTree(List<X> trees) {
		return resolveTree(trees, null);
	}

	/**
	 * 将平面结构的数据，变成立体结构的数据
	 *
	 * @param trees
	 */
	public static <X extends TreeNode> List<X> resolveTree(List<X> trees, String rootId) {
		List tree = new ArrayList();
		List<X> roots = getRootNode(trees, rootId);
		for (X root : roots) {
			addNode(root, trees);
			tree.add(root);
		}
		return tree;
	}

	/**
	 * 获取根节点
	 *
	 * @param trees  树结构数据
	 * @param rootId 根节点Id
	 * @param <X>    实现类泛型
	 * @return 解析过的树状结构数据
	 */
	private static <X extends TreeNode> List<X> getRootNode(List<X> trees, String rootId) {
		List<X> ret = new ArrayList<X>();
		for (Iterator<X> iterator = trees.iterator(); iterator.hasNext(); ) {
			X tree = iterator.next();
			if ((rootId == null && tree.parentId() == null)
					|| (rootId != null && rootId.equals(tree.parentId()))) {
				ret.add(tree);
				iterator.remove();
			}
		}
		return ret;
	}

	/**
	 * 为树状结构的每个节点增加子节点
	 *
	 * @param root  根节点
	 * @param trees 树状结构数据
	 * @param <X>   实现类泛型
	 */
	public static <X extends TreeNode> void addNode(TreeNode root, List<X> trees) {
		//System.out.println(trees.size());
		for (int i = 0; i < trees.size(); i++) {
			X tree = trees.get(i);
			if (tree.parentId() != null && tree.parentId().equals(root.identity())) {
				root.children().add(tree);
				//递归调用自身
				addNode(tree, trees);
			}
		}
	}

	/**
	 * 将树转换为json格式的数据
	 *
	 * @param trees 树结构
	 * @return json字符串
	 */
	public static String toJsonString(List<? extends TreeNode> trees) {
		return JsonUtil.obj2Json(trees, false);
	}

	public static List<TreeNode> getSubNodes() {
		return null;
	}
}
